///*
// * ADC.c
// *
// *  Created on: May 20, 2020
// *      Author: Alka
// */
// #include "ADC.h"

// #ifdef USE_ADC_INPUT
// uint16_t ADCDataDMA[4];
// #else
// uint16_t ADCDataDMA[3];
// #endif

// extern uint16_t ADC_raw_temp;
// extern uint16_t ADC_raw_volts;
// extern uint16_t ADC_raw_current;
// extern uint16_t ADC_raw_input;

//#define ADC_DELAY_CALIB_ENABLE_CPU_CYCLES \
//    (LL_ADC_DELAY_CALIB_ENABLE_ADC_CYCLES * 64)

// void ADC_DMA_Callback()
//{ // read dma buffer and set extern variables

// #ifdef USE_ADC_INPUT
//     ADC_raw_temp = ADCDataDMA[3];
//     ADC_raw_volts = ADCDataDMA[1] / 2;
//     ADC_raw_current = ADCDataDMA[2];
//     ADC_raw_input = ADCDataDMA[0];

// #else
//     ADC_raw_temp = ADCDataDMA[2];
//     ADC_raw_volts = ADCDataDMA[1];
//     ADC_raw_current = ADCDataDMA[0];
// #endif
// }

// void enableADC_DMA()
//{ // enables channel

//    NVIC_SetPriority(DMA1_Channel2_3_IRQn, 3);
//    NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);

//    LL_DMA_ConfigAddresses(
//        DMA1, LL_DMA_CHANNEL_2,
//        LL_ADC_DMA_GetRegAddr(ADC1, LL_ADC_DMA_REG_REGULAR_DATA),
//        (uint32_t)&ADCDataDMA, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);

//    /* Set DMA transfer size */
// #ifdef USE_ADC_INPUT
//    LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_2, 4);
// #else
//    LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_2, 3);

// #endif
//     /* Enable DMA transfer interruption: transfer complete */
//     LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_2);

//    /* Enable DMA transfer interruption: transfer error */
//    LL_DMA_EnableIT_TE(DMA1, LL_DMA_CHANNEL_2);

//    /*## Activation of DMA
//     * #####################################################*/
//    /* Enable the DMA transfer */
//    LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_2);
//}

// void activateADC(void)
//{
//     __IO uint32_t wait_loop_index = 0U;
//     __IO uint32_t backup_setting_adc_dma_transfer = 0U;

//    if (LL_ADC_IsEnabled(ADC1) == 0) {
//        /* Enable ADC internal voltage regulator */
//        LL_ADC_EnableInternalRegulator(ADC1);
//        wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US
//                               * (SystemCoreClock / (100000 * 2)))
//            / 10);
//        while (wait_loop_index != 0) {
//            wait_loop_index--;
//        }
//        backup_setting_adc_dma_transfer = LL_ADC_REG_GetDMATransfer(ADC1);
//        LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_NONE);

//        /* Run ADC self calibration */
//        LL_ADC_StartCalibration(ADC1);

//        /* Poll for ADC effectively calibrated */

//        while (LL_ADC_IsCalibrationOnGoing(ADC1) != 0) {
//        }
//        /* Restore ADC DMA transfer request after calibration */
//        LL_ADC_REG_SetDMATransfer(ADC1, backup_setting_adc_dma_transfer);

//        /* Delay between ADC end of calibration and ADC enable. */
//        /* Note: Variable divided by 2 to compensate partially */
//        /*       CPU processing cycles (depends on compilation optimization).
//        */ wait_loop_index = (ADC_DELAY_CALIB_ENABLE_CPU_CYCLES >> 1); while
//        (wait_loop_index != 0) {
//            wait_loop_index--;
//        }
//        /* Enable ADC */
//        LL_ADC_Enable(ADC1);
//        while (LL_ADC_IsActiveFlag_ADRDY(ADC1) == 0) {
//        }
//        ADC->CCR |= ADC_CCR_TSEN;
//    }
//}
// void ADC_Init(void)
//{
//    LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = { 0 };
//    LL_ADC_InitTypeDef ADC_InitStruct = { 0 };

//    LL_GPIO_InitTypeDef GPIO_InitStruct = { 0 };

//    /* Peripheral clock enable */
//    LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC);

//    LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
//    /**ADC1 GPIO Configuration
//    PA4   ------> ADC1_IN4
//    PA6   ------> ADC1_IN6
//    */
//    GPIO_InitStruct.Pin = VOLTAGE_ADC_PIN;
//    GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
//    GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
//    LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

//    GPIO_InitStruct.Pin = CURRENT_ADC_PIN;
//    GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
//    GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
//    LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

//    /* ADC1 DMA Init */

//    /* ADC1 Init */
//    LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_2, LL_DMAMUX_REQ_ADC1);

//    LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_2,
//        LL_DMA_DIRECTION_PERIPH_TO_MEMORY);

//    LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_2,
//        LL_DMA_PRIORITY_HIGH);

//    LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_2, LL_DMA_MODE_CIRCULAR);

//    LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_2,
//    LL_DMA_PERIPH_NOINCREMENT);

//    LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_2, LL_DMA_MEMORY_INCREMENT);

//    LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_2, LL_DMA_PDATAALIGN_WORD);

//    LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_2, LL_DMA_MDATAALIGN_HALFWORD);

//    /* USER CODE BEGIN ADC1_Init 1 */

//    /* USER CODE END ADC1_Init 1 */
//    /** Configure Regular Channel
//     */
//    LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADC1),
//        LL_ADC_CHANNEL_TEMPSENSOR);
//    /** Configure the global features of the ADC (Clock, Resolution, Data
//     * Alignment and number of conversion)
//     */
//    ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE;
//    ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS;
//    ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
//    ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_SINGLE;
//    ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_LIMITED;
//    ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_PRESERVED;
//    LL_ADC_REG_Init(ADC1, &ADC_REG_InitStruct);
//    // LL_ADC_REG_SetTriggerEdge(ADC1, LL_ADC_REG_TRIG_EXT_FALLING);
//    LL_ADC_SetOverSamplingScope(ADC1, LL_ADC_OVS_DISABLE);
//    LL_ADC_SetTriggerFrequencyMode(ADC1, LL_ADC_CLOCK_FREQ_MODE_LOW);
//    LL_ADC_REG_SetSequencerConfigurable(ADC1, LL_ADC_REG_SEQ_CONFIGURABLE);
//    LL_ADC_SetClock(ADC1, LL_ADC_CLOCK_ASYNC_DIV4);
//    LL_ADC_SetSamplingTimeCommonChannels(ADC1, LL_ADC_SAMPLINGTIME_COMMON_1,
//        LL_ADC_SAMPLINGTIME_19CYCLES_5);
//    LL_ADC_SetSamplingTimeCommonChannels(ADC1, LL_ADC_SAMPLINGTIME_COMMON_2,
//        LL_ADC_SAMPLINGTIME_160CYCLES_5);
//    LL_ADC_DisableIT_EOC(ADC1);
//    LL_ADC_DisableIT_EOS(ADC1);

//    ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B;
//    ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
//    ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE;
//    LL_ADC_Init(ADC1, &ADC_InitStruct);

//    LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1,
//    CURRENT_ADC_CHANNEL); LL_ADC_SetChannelSamplingTime(ADC1,
//    CURRENT_ADC_CHANNEL,
//        LL_ADC_SAMPLINGTIME_COMMON_1);

//    LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_2,
//    VOLTAGE_ADC_CHANNEL); LL_ADC_SetChannelSamplingTime(ADC1,
//    VOLTAGE_ADC_CHANNEL,
//        LL_ADC_SAMPLINGTIME_COMMON_1);

//    LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_3,
//        LL_ADC_CHANNEL_TEMPSENSOR);
//    LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_TEMPSENSOR,
//        LL_ADC_SAMPLINGTIME_COMMON_2);
//}
